#include"SeqList.h"
//动态顺序表的初始化
void SLInit(SL* ps)
{
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}
//动态顺序表的销毁
void SLDestroy(SL* ps)
{
	if (ps->arr)
	{
		free(ps->arr);
	}
		ps->arr = NULL;
		ps->size = ps->capacity = 0;
}

void SLCheckCapacity(SL* ps)//判断空间是否充足，若不足，先增容，再插入
{
	if (ps->size == ps->capacity)
	{
		//增容（一般是成倍数增加）
		//若capacity为0.给个默认值，否则x2倍
		int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		SLDatatype* tmp = (SLDatatype*)realloc(ps->arr, newCapacity * sizeof(SLDatatype));//申请的是newCapacity个 整型 字节大小的空间
		if (tmp == NULL)//动态空间申请失败
		{
			perror("realloc fail");//打印的一个信息
			exit(1);//不继续插入数据，exit(1)表示异常退出.这个1是返回给操作系统的。 
		}
		ps->arr = tmp;
		ps->capacity = newCapacity;
	}
}


void SLPushBack(SL* ps, SLDatatype x) //尾插
{
	//防止传入空的顺序表
	//粗暴的解决方法
	assert(ps); //表达式为真，可以继续进行,等价于ps！=NULL

	///温柔的方式
		//if (ps == null)
		//{
		//	return;
		//}

	SLCheckCapacity(ps);
	ps->arr[ps->size] = x;
	ps->size++;
	 
}


void SLPushFront(SL* ps, SLDatatype x) //头插
{
	assert(ps);
	SLCheckCapacity(ps);

	//整体数据后移一位
	for (int i = ps->size; i >0; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}

	//下标为0的位置空出来
	ps->arr[0] = x;
	ps->size++;
}

void SLInsert(SL* ps, SLDatatype x, int pos)//指定位置之前插入数据
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);//等于时，分别代表头插和尾插

	SLCheckCapacity(ps);

	//pos及之后的数据整体向后移动一位
	for (int i = ps->size; i > pos ; i--)
	{
		ps->arr[i] = ps->arr[i - 1];//最后一次移动是 pos+1=pos
	}

	ps->arr[pos] = x;
	ps->size++;
}

void SLPopBack(SL* ps)//尾删
{
	assert(ps);
	assert(ps->size);

	//ps->arr[ps->size - 1] = -1; //多余的。可要可不要
	ps->size--;
}

void SLPopFront(SL* ps) //头删
{
	assert(ps);
	assert(ps->size);

	//数据整体向前挪动一位
	for (int i = 0; i < ps->size-1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}


void SLErase(SL* ps, int pos)//删除指定位置的数据
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	
	//pos之后的数据整体向前挪动一位
	for (int i = pos; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->size--;
}


int  SLFind(SL* ps, SLDatatype x) //查找
{
	assert(ps);
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == x) 
		{
			return i;
		}
	}
	//没有找到，返回无效下标
	return -1;
}



void SLPrint(SL* ps)
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}
